package main

import (
	"cgin"
	"log"
)

// User 定义用户结构体
type User struct {
	Name  string `json:"name"`
	Email string `json:"email"`
	Age   int    `json:"age"`
}

// Validate 实现 Validator 接口进行自定义验证
func (u *User) Validate() error {
	errors := cgin.ValidationErrors{}

	if u.Name == "" {
		errors["name"] = "姓名不能为空"
	}

	if u.Email == "" {
		errors["email"] = "邮箱不能为空"
	} else if !cgin.IsEmail(u.Email) {
		errors["email"] = "邮箱格式不正确"
	}

	if u.Age < 0 || u.Age > 150 {
		errors["age"] = "年龄必须在 0-150 之间"
	}

	if len(errors) > 0 {
		return errors
	}
	return nil
}

type LoginRequest struct {
	Username string `json:"username"`
	Password string `json:"password"`
}

func main() {

	r := cgin.New()
	//全局中间件
	r.Use(cgin.Logger(), cgin.Recovery(), cgin.Cors())

	//基本路由
	r.GET("/", func(c *cgin.Context) {
		c.JSON(200, cgin.H{
			"message": "welcome to cgin",
		})
	})
	//路由分组
	api := r.Group("/api/v1")
	{
		api.GET("/users", func(c *cgin.Context) {
			c.JSON(200, cgin.H{
				"users": []string{"xiongwj"},
			})
		})

		api.GET("/user/:id", func(c *cgin.Context) {
			c.JSON(200, cgin.H{
				"user_id": c.Param("id"),
			})
		})
		// 创建用户 - 使用 BindJSON
		api.POST("/users", func(c *cgin.Context) {
			var user User
			// 方式1: 手动处理错误
			if err := c.BindJSON(&user); err != nil {
				c.JSON(400, cgin.H{
					"error": err.Error(),
				})
				return
			}

			// 验证数据
			if err := cgin.ValidateStruct(&user); err != nil {
				c.JSON(400, cgin.H{
					"error": err.Error(),
				})
				return
			}

			c.JSON(201, cgin.H{
				"message": "用户创建成功",
				"user":    user,
			})
		})

		// 登录 - 使用 ShouldBindJSON (自动处理错误)
		api.POST("/login", func(c *cgin.Context) {
			var req LoginRequest
			c.ShouldBindJSON(&req) // 如果出错会自动返回 400

			// 简单的字段验证
			if req.Username == "" || req.Password == "" {
				c.JSON(400, cgin.H{
					"error": "用户名和密码不能为空",
				})
				return
			}

			c.JSON(200, cgin.H{
				"message":  "登录成功",
				"username": req.Username,
			})
		})

		// 获取原始 JSON 数据
		api.POST("/raw", func(c *cgin.Context) {
			body, err := c.GetBody()
			if err != nil {
				c.JSON(400, cgin.H{"error": err.Error()})
				return
			}

			c.JSON(200, cgin.H{
				"raw_body": string(body),
			})
		})

		// 获取特定 JSON 字段
		api.POST("/profile", func(c *cgin.Context) {
			username := c.GetJSON("username")
			email := c.GetJSON("email")

			c.JSON(200, cgin.H{
				"username": username,
				"email":    email,
			})
		})
	}

	//静态文件服务
	r.GET("/static/*filepath", func(c *cgin.Context) {
		filepath := c.Param("filepath")
		c.String(200, "Requested file: %s", filepath)
	})

	log.Println("Server starting on :8080")
	r.Run(":8080")

}
